{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "并发与并行概念\n",
    "\n",
    "- 并发定义: 多个任务在单核CPU上通过时间片轮转交替执行，造成\"同时运行\"的假象\n",
    "- 并行定义: 多个任务真正在多核CPU上同时执行\n",
    "- 关键区别:\n",
    "  - 并发是逻辑上的同时，通过快速切换实现\n",
    "  - 并行是物理上的同时，需要多核硬件支持"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "CPU密集型任务处理\n",
    "\n",
    "- 单线程适用性:\n",
    "  - 适合纯CPU密集型任务（如连续数学计算）\n",
    "  - 原因：单线程可独占CPU资源，避免线程切换开销\n",
    "- 多线程问题:\n",
    "  - 线程调度会产生额外开销（上下文切换）\n",
    "  - 上下文切换需要保存/恢复CPU寄存器、线程栈等状态\n",
    "  - 示例：单核CPU上10ms时间片轮转调度多个计算任务"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "IO密集型任务处理\n",
    "\n",
    "- 多线程优势:\n",
    "  - 当线程阻塞在IO时，CPU可执行其他线程任务\n",
    "  - 特别适合包含IO等待的操作（如文件读写、网络请求）\n",
    "- 混合型任务:\n",
    "  - 同时包含CPU计算和IO操作的任务\n",
    "  - 设计建议：优先采用多线程架构"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程调度机制\n",
    "- 阻塞队列: 存放等待IO/资源而暂停的线程（Blocking状态）\n",
    "- 调度过程:\n",
    "  - CPU从就绪队列选取线程执行\n",
    "  - 遇到IO阻塞时线程移入阻塞队列\n",
    "  - IO完成后线程返回就绪队列"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "适用场景分析\n",
    "\n",
    "- 关键判断: 需区分程序类型是IO密集型还是CPU密集型\n",
    "- IO密集型:\n",
    "  - 特点: 程序执行时间主要消耗在IO操作（如文件读写、网络请求）\n",
    "  - 优势: 多线程可有效利用IO等待时间执行其他任务\n",
    "- CPU密集型:\n",
    "  - 特点: 程序执行时间主要消耗在CPU计算\n",
    "  - 单核情况: 多线程会因上下文切换带来额外开销\n",
    "  - 多核情况: 可充分利用多核优势实现真正并行"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程上下文切换\n",
    "\n",
    "- 定义: CPU从一个线程切换到另一个线程时需要保存和恢复执行状态的过程\n",
    "- 开销来源:\n",
    "  - 寄存器状态的保存与恢复\n",
    "  - 缓存失效\n",
    "  - 调度器开销\n",
    "- 影响:\n",
    "  - 线程数量越多，切换频率越高\n",
    "  - 在CPU密集型任务中可能成为性能瓶颈"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "IO密集型\n",
    "\n",
    "- 定义：程序中的指令执行涉及IO操作，如设备、文件、网络操作（如等待客户端连接）\n",
    "- 关键特性：IO操作可以将程序阻塞住，当IO资源未准备好时，进程会被放入阻塞队列\n",
    "- 典型场景：网络服务程序等待客户端连接时，由于连接时间不确定，程序会被阻塞\n",
    "- 资源利用：IO密集型程序阻塞时不会占用CPU资源，CPU时间片可分配给其他就绪任务"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "CPU密集型\n",
    "\n",
    "- CPU密集型的定义 \n",
    "  - 本质特征：程序指令主要进行数值计算，如大数据分析、深度学习训练\n",
    "  - 典型例子：计算1到10亿的累加运算，持续进行数学运算的程序\n",
    "  - 与IO密集型对比：不涉及等待外部资源的操作，指令流连续不间断\n",
    "- CPU密集型的特点 \n",
    "  - 资源占用：持续占用CPU计算资源，不会主动释放CPU时间片\n",
    "  - 阻塞特性：不会因资源等待而被阻塞，始终处于就绪队列\n",
    "  - 硬件要求：需要CPU保持高频运算状态，可通过散热或调频管理\n",
    "- IO密集型的定义与特点 \n",
    "  - 阻塞机制：当网络连接未建立、文件未就绪时，程序会被操作系统阻塞\n",
    "  - 队列管理：被阻塞的进程会移出就绪队列，进入blocking queue\n",
    "  - 调度优势：阻塞期间CPU可调度其他任务，提高整体资源利用率\n",
    "- CPU密集型与IO密集型的区别 \n",
    "  - 资源影响：CPU密集型会持续占用计算资源，IO密集型会主动让出资源\n",
    "  - 类比说明：CPU密集型像持续思考的大脑，IO密集型像会发呆的工作者\n",
    "  - 设计原则：IO密集型更适合多线程设计，可避免CPU资源闲置"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "多核与单核的区别 \n",
    "\n",
    "- 多核环境对程序的影响 \n",
    "  - 并行优势：多核CPU可真正并行执行多个线程任务\n",
    "  - 适用场景：无论CPU密集型还是IO密集型，多核环境下多线程都有价值\n",
    "- CPU密集型程序与多核 \n",
    "  - 任务拆分：如将1-10亿累加拆分为task1(1-5亿)和task2(5-10亿)\n",
    "  - 核间分配：不同计算任务可分配到不同CPU核心同时执行\n",
    "  - 效率提升：多核并行计算比单核串行计算显著提高效率\n",
    "- IO密集型程序与多核 \n",
    "  - 阻塞管理：当某线程因IO阻塞时，其他线程仍可使用其他核心\n",
    "  - 队列机制：阻塞线程自动移入blocking queue，不占用就绪队列资源\n",
    "  - 设计优势：多线程可最大化利用多核处理IO等待时间\n",
    "- IO密集型程序与单核 \n",
    "  - 仍然适用：即使单核，IO阻塞时CPU可执行其他线程任务\n",
    "  - 资源优化：不会因IO等待导致CPU空闲，提高资源利用率\n",
    "- CPU密集型程序与单核 \n",
    "  - 效率问题：单核多线程反而降低效率，因线程切换需要额外开销\n",
    "  - 切换损耗：需要保存/恢复线程上下文信息（寄存器状态等）\n",
    "  - 计算示例：单核下1个线程完成1-10亿累加比多个线程更快\n",
    "- 线程的上下文切换 \n",
    "  - 切换过程：\n",
    "    - 保存当前线程的CPU寄存器状态到线程栈\n",
    "    - 加载下一线程的寄存器状态从对应线程栈\n",
    "    - 恢复执行新线程的指令流\n",
    "  - 性能影响：每次切换需要约1-5微秒开销，高频切换显著降低性能\n",
    "  - 内核机制：涉及用户态与内核态转换，需要访问线程的内核栈\n",
    "  - 设计准则：\n",
    "    - 多核环境：两种类型都适合多线程\n",
    "    - 单核环境：仅IO密集型适合多线程\n",
    "    - 混合任务：含IO操作的部分即适合多线程设计"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
